package com.atguigu.gulimall.product;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * 1.整合Mybatis-Plus
 *         1)导入依赖
 *         2）配置
 *              1.配置数据源
 *                  1).导入数据库的驱动
 *                  2）.在application.yml配置数据源相关信息
 *              2.配置Mybatis-Plus
 *                  1).使用@MapperScan
 *                  2).告诉Mybatis-Plus.sql映射文件位置
 * 2.使用逻辑删除
 *     1)配置全局的逻辑删除规则
 *     2）配置逻辑删除的组件Bean（省略）
 *     3)加上Bean逻辑删除注解@TableLogic
 * 3、JSR303
 *      1)、给Bean中字段上添加校验注解，javax.validation.constraints，定义自己的message提示
 *      2)、开启校验功能@Valid
 *          效果：校验错误会有默认的响应；
 *      3）、给校验的Bean后面紧跟着一个BindingResult,就可以获取到校验的结果
 *      4)、分组校验
 *          1、@NotBlank(message = "品牌名必须提交",groups = {AddGroup.class,UpdateGroup.class})
 *              给校验注解标注什么情况需要校验字段
 *          2、@Validated({AddGroup.class}
 *          3、默认没有指定分组的校验注解@NotBlank，在分组校验情况的@Validated({UpdateGroup.class})下不生效
 *      5)、自定义校验
 *          1)、编写一个自定义的校验注解
 *          2)、编写一个自定义的校验器 @ConstraintValidator
 *          3)、关联自定义的校验器和自定义的校验注解
             * @Documented
             * @Constraint(validatedBy = {ListValueConstraintValidator.class},可以指定多个不同的校验器,适配不同类型的校验)
             * @Target({METHOD, FIELD,  ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
             * @Retention(RUNTIME)
 * 4、统一的异常处理
 * @ControllerAdvice
 *     1)、编写处理异常类，使用@ControllerAdvice注解
 *     2)、使用@ExceptionHandler标注方法可以处理异常
 *
 *5、引入模板引擎
 *  1)、spring-boot-starter-thymeleaf 关闭缓存
 *  2)、静态资源都放在static文件夹下就可以按照路径直接访问
 *  3)、页面放在template下，直接访问
 *      Springboot,访问项目的时候，默认会找index
 *  4)、页面修改不重启服务器实时更新
 *      1)、引入spring-boot-devtools
 *      2)、修改完页面 ctrl + shift +f9 重新编译页面，代码配置，建议重启
 *
 * 6、整合redis
 *  1)、引入spring-boot-starter-data-redis
 *  2)、简单配置redis的host等信息
 *  3)、使用SpringBoot自动配置好的StringRedisTemplate来操作redis
 *
 *  7、整合redisson作为分布式锁等功能框架
 *      1)、引入依赖
 *      2)、配置redisson,MyRedissonConfig配置一个RedissonClient
 *
 *  8、整合SpringCache简化缓存开发
 *      1)、引入依赖spring-boot-starter-cache、spring-boot-starter-data-redis
 *      2)、写配置
 *          (1)CaccheAutoConfiguration会导入RedisCacheConfiguration
 *          自动配好了缓存管理器RedisCacheManager
 *          (2)、配置使用redis作为缓存
 *      3)、测试使用缓存
 *          @Cacheable: Triggers cache population.触发将数据保存到缓存的操作
 *          @CacheEvict: Triggers cache eviction.触发将数据从缓存中删除的操作
 *          @CachePut: Updates the cache without interfering with the method execution.不影响方法执行更新缓存
 *          @Caching: Regroups multiple cache operations to be applied on a method.组合以上多个操作
 *          @CacheConfig: Shares some common cache-related settings at class-level.在类级别共享缓存的相同配置
 *          1)、开启缓存功能@EnableCaching
 *          2)、只需要使用注解就能完成缓存操作
 *      4)、原理：
 *          CacheAutoConfiguration -> RedisCacheConfiguration ->
 *          自动配置了RedisCacheManager->初始化所有的缓存->每个缓存决定了使用什么配置
 *          ->如果RedisCacheConfiguration有就用已有的，没有就默认配置
 *          ->想改缓存的配置，只需要给容器中放一个RedisCacheConfiguration即可
 *          ->就会应用到当前的RedisCacheManager管理的所有缓存分区中
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(GulimallProductApplication.class);
        springApplication.setAllowCircularReferences(Boolean.TRUE);
        springApplication.run(args);
    }

}
